/********************************************************************/
/*  Hochschule für Technik und Wirtschaft							*/
/*  Fachbereich GIS													*/
/*  Hardware-Labor													*/
/*  Mikroprozessortechnik											*/
/********************************************************************/
/*                                                       		    */
/*  C_Übung.C:			 	  										*/
/*		Programmrumpf für C-Programme mit dem Keil					*/
/*		Entwicklungsprogramm uVision3 für ARM-Mikrocontroller		*/
/*                                                       		    */
/********************************************************************/
/*	Aufgaben-Nr.:			* 4.1.2							        */
/*              			*										*/
/********************************************************************/
/* 	Gruppen-Nr.: 			*										*/
/*              			*										*/
/********************************************************************/
/*	Name / Matrikel-Nr.:    * Christoph Zell      ()                */
/*              			* Benjamin  Friedrich (3453464)    	    */
/*              			*										*/
/********************************************************************/
/* 	Abgabedatum:            * 22.01.2009 						    */
/*          	    		*										*/
/********************************************************************/

#include "lpc21xx.h"		/* LPC21xx Definitionen 				*/

/********************************************************************/
/* 	Funktion:    	main		               	       	   		  	*/
/* 	Beschreibung:	Hauptprogramm	          	           		  	*/
/********************************************************************/
/* 	Eingangsparameter:	kein										*/
/* 	Ausgabeparameter:	kein	  	     				 			*/
/* 	Rückgabewert:		kein	   						    		*/
/********************************************************************/

/**
 * Eingabe:
 * --------
 * Taster: P0.15 EINT2
 */

/*
 * Ausgabe:
 * --------
 * LED1: P1.16
 * LED2: P1.17
 * LED3: P1.18
 * LED4: P1.19
 * LED5: P1.20
 * LED6: P1.21
 * LED7: P1.22
 * LED8: P1.23
 */
//----------LED:           -876 5432 1--- ---- ---- ----
#define LED_ALL 0x07F800 // 0111 1111 1000 0000 0000 0000
#define LED1    0x008000 // 0000 0000 1000 0000 0000 0000
#define LED2    0x010000 // 0000 0001 0000 0000 0000 0000
#define LED3    0x020000 // 0000 0010 0000 0000 0000 0000
#define LED4    0x040000 // 0000 0100 0000 0000 0000 0000
#define LED5    0x080000 // 0000 1000 0000 0000 0000 0000
#define LED6    0x100000 // 0001 0000 0000 0000 0000 0000
#define LED7    0x200000 // 0010 0000 0000 0000 0000 0000
#define LED8    0x400000 // 0100 0000 0000 0000 0000 0000

#define NUMBER_OF_LEDS     8;
#define WAIT_ITERATIONS 1000;

const  unsigned long  ledTab[]   = {LED1, LED2, LED3, LED4, LED5, LED6, LED7, LED8};
static unsigned short currentLED = 0;


void handleInputISR(void) __irq
{
	/* Diese ISR kann nur in Verbindung mit P0.15 (Taster) ausgelöst
	   werden, daher ist keine Prüfung auf Eingabe-Pin notwendig. */

	// Warte-Schleife zum entprellen
	for(int i = 0; i < WAIT_ITERATION; ++i);

	IOCLR1     = ledTab[currenTab]; // zuletzt aktivierte LEDS deaktivieren
	currentLED = (currentLED +1) % NUMBER_OF_LEDS;
	IOSET1     = ledTab[currentLED];

	EXTINT      = 0x04; // quittieren von EINT2
	VICVectAddr = 0x0;  // Ende ISR
}

void main (void)
{
	signed   short iteration = 0;

	IODIR1     = LED_ALL; // P1.16 - P1.23 als Ausgang definieren
	IOSET      = LED1;    // LED 1 soll als erstes leuchten

	EXTMODE   |= 0x04;  // EINT2 flankenabhängig 0000 0100
    EXTPOLAR0 |= 0x04;  // EINT2 steigende Flanke eingestellt
    PINSEL0   |= 0x04 ; // P0.15 (Taster) für EINT2 konfiguriern

    VICVectCntl10 = 0x5F; // EINT2 für Kanal 16 aktiviern 0101 1111 (EINT2 (0100); Kanal 16 11111 )
    VICVectAddr0 = (unsigned long) handleInputISR;
    VICIntEnable = 0x10000; //IR von Kanal 16 erlauben  0001 0000 0000 0000 0000

	while (1); /* Endlos-Hauptschleife */
}
